package 数组;

class SolutionDemo01 {
    /**
     * 合并两个有序数组
     *
     * @param nums1 数组1
     * @param m     数组1的长度
     * @param nums2 数组2
     * @param n     数组2的长度
     *              nums1.length() = m+n
     */

    /*
     * 思路 : 从后往前遍历 哪个数大 就把大的那个数放到数组1的末尾
     * */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int tail = m + n - 1;
        int i = m - 1;
        int j = n - 1;

        while (i >= 0 && j >= 0) {
            if (nums1[i] > nums2[j]) {
                nums1[tail--] = nums1[i--];
            } else {
                nums1[tail--] = nums2[j--];
            }
        }

        // 如果跳出循环之后 i >= 0 此时表示数组2中的元素已经全部移入数组1中 什么都不需要处理
        // 如果跳出循环之后 j >= 0 此时表示数组2中的元素未完全移入数组1中 需要进行后续处理
        if (j >= 0) {
            while (tail >= 0) {
                nums1[tail--] = nums2[j--];
            }
        }
    }
}
/*
* 题目评价: 如果没有掌握分析到位,此题还是有一点麻烦的 关键点就是从后往前进行遍历
* */
